f1::Int->Int
f1 1 = 8
f1 4 = 131
f1 16 = 16

f2 :: Int -> Int
f2 8 = 16
f2 16 = 4
f2 131 = 1


f1of2 :: Int -> Int
f1of2 8 = f1(f2(8))
f1of2 16 = f1(f2(16))
f1of2 131 = f1(f2(131))

f4::Int -> Int
f4 n | n <= 10 = n
f4 n | n > 10 = n+1

f5:: Int -> Int
f5 0 = 0
f5 1 = 1 
f5 n = potenciaVeces n n-1

potenciaVeces::Int-> Int -> Int
potenciaVeces n c = if c > 0 then n * potenciaVeces  n (c - 1) else n   

data N = Z | S N 

igual :: N -> N -> Bool
igual Z Z = True
igual (S n) Z = False
igual Z (S n) = False
igual (S n) (S m) = igual n m

suma:: N -> N-> N
suma n Z = n
suma (S n) (S m) = suma (S(S n)) m

menor:: N -> N -> Bool
menor Z Z = False
menor (S n) Z = False
menor Z (S n) = True
menor (S n) (S m) = menor n m

producto :: N -> N -> N
producto Z Z = Z
producto (S n) Z = Z
producto Z (S n) = Z

  
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo deriving(Eq , Ord, Enum, Show)

siguiente:: Dia->Dia
siguiente d = succ(d)

esLaborable:: Dia-> Bool
esLaborable d = d <= Viernes

esFinDeSemana :: Dia->Bool
esFinDeSemana d = not (esLaborable d)







